#include "volumecontenthandler.hpp"

VolumeContentHandler::VolumeContentHandler() {
  numVoxels=0;
  dim << 0,0,0;
  delta=0.0;
  pos << 0,0,0;
  inComingData=false;
}

VolumeContentHandler::~VolumeContentHandler() {
}

bool VolumeContentHandler::startElement(const QString &namespaceURI,const QString &localName,const QString &qName,const QXmlAttributes &atts) {
  if (namespaceURI.isEmpty() && localName==qName) {
    if (qName=="size") {
      dim << atts.value("x").toInt(),atts.value("y").toInt(),atts.value("z").toInt();
      delta=atts.value("delta").toDouble();
      numVoxels=dim.prod();
      return true;
    } else if (qName=="position") {
      pos << atts.value("x").toDouble(),atts.value("y").toDouble(),atts.value("z").toDouble();
      return true;
    } else if (qName=="data") {
      if (atts.value("encoding")!="base64") return false;
      inComingData=true;
      return true;
    } else {
      return true;
    }
  } else {
    return false;
  }
}
bool VolumeContentHandler::characters(const QString &data) {
  if (inComingData) {
    this->data=QByteArray::fromBase64(data.toAscii());
  }
  return true;
}

bool VolumeContentHandler::endElement(const QString &namespaceURI,const QString &localName,const QString &qName) {
  if (namespaceURI.isEmpty() && localName==qName) {
    if (qName=="data") {
      inComingData=false;
      return true;
    } else {
      return true;
    }
  } else {
    return false;
  }
}

const Vector3i & VolumeContentHandler::getSize() const {
  return dim;
}

double VolumeContentHandler::getDelta() {
  return delta;
}

const Vector3d & VolumeContentHandler::getPosition() const {
  return pos;
}

unsigned char * VolumeContentHandler::getVoxels() {
  return (unsigned char *)data.data();
}

int VolumeContentHandler::getNumVoxels() {
  return numVoxels;
}
